﻿
namespace FastFood.Windows.Forms.Procesos
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using FastFood.Business.Entities;
    using FastFood.Windows.Helpers;
    using FastFood.Business.Entities.Tipos;
    using FastFood.Business.Logic;

    public partial class CwfDetallesVentas : UserControl
    {
        private CwfDetVentaBusqueda detVentaBusqueda;
        private CwfVentas _cwfVentas;
        private List<DetalleVendibles> _ListaDetalle;
        private List<DetallesVentasInsumos> _detallesInsumos;
        private List<DetallesVentasProductos> _detallesProductos;
        private List<DetallesVentasCombos> _detallesCombos;

        public CwfVentas cwfVentas
        {
            set { _cwfVentas = value; }
        }
        public int CantidadDetalle
        {
            get { return _ListaDetalle.Count; }
        }
        public List<DetalleVendibles> ListaDetalle
        {
            set
            {
                _ListaDetalle = value;
                _detallesInsumos = new List<DetallesVentasInsumos>();
                _detallesProductos = new List<DetallesVentasProductos>();
                _detallesCombos = new List<DetallesVentasCombos>();

                if (value != null)
                {
                    foreach (DetalleVendibles detalle in _ListaDetalle)
                    {
                        if (detalle.tipo == TipoVendible.Insumo) _detallesInsumos.Add(detalle.ConvertToDetalleInsumos());
                        else if (detalle.tipo == TipoVendible.Producto) _detallesProductos.Add(detalle.ConvertToDetalleProductos());
                        else if (detalle.tipo == TipoVendible.Combo) _detallesCombos.Add(detalle.ConvertToDetalleCombos());
                    }
                }
            }
        }
        public List<DetallesVentasInsumos> detallesInsumos 
        {
            get { return _detallesInsumos; }
        }
        public List<DetallesVentasProductos> detallesProductos 
        {
            get { return _detallesProductos; }
        }
        public List<DetallesVentasCombos> detallesCombos
        {
            get { return _detallesCombos; }
        }
        public double PorcIGV { set { detVentaBusqueda.PorcIGV = value; } }
        public double PorcServicios { set { detVentaBusqueda.PorcServicios = value; } }

        public EstadoActual estadoActual;

        public CwfDetallesVentas()
        {
            InitializeComponent();
        }

        private void CwfDetalle_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                ClearControls();
                InitialLoad();
                EnabledControls(true);
                EnabledButtons(true);

                detVentaBusqueda = new CwfDetVentaBusqueda();
                detVentaBusqueda.CwfDetVentaBusqueda_SeleccionEntidad += new GetObjeto(insumosBusqueda_CwfInsumoBusqueda_SeleccionEntidad);
                detVentaBusqueda.BorderStyle = BorderStyle.None;
                vendibleCmb.DropDownControl = detVentaBusqueda;
            }
        }

        private void Focus_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        private void TsbNuevo_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Nuevo;
            EnabledControls(false);
            EnabledButtons(false);
            ClearControls();
            
            this.vendibleCmb.Focus();
            this.detVendiblesBindingSource.AddNew();
        }

        private void TsbEditar_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Editar;
            EnabledControls(false);
            EnabledButtons(false);
            this.vendibleCmb.Focus();
        }

        private void TsbEliminar_Click(object sender, EventArgs e)
        {
            if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.Yes)
            {
                this.estadoActual = EstadoActual.Eliminar;
                SaveData();
                this.estadoActual = EstadoActual.Normal;
                if (this.detVendiblesBindingSource.Current != null)
                {
                    LoadDetalle(this.detVendiblesBindingSource.Current as DetalleVendibles);
                }
            }
        }

        private void TsbGuardar_Click(object sender, EventArgs e)
        {
            if (ValidateData())
            {
                if (SaveData())
                {
                    this.estadoActual = EstadoActual.Normal;
                    if (this.detVendiblesBindingSource.Current != null)
                    {
                        LoadDetalle(this.detVendiblesBindingSource.Current as DetalleVendibles);
                    }

                    EnabledControls(true);
                    EnabledButtons(true);
                    this.detallesVentasDataGridView.Focus();
                }
            }
        }

        private void TsbCancelar_Click(object sender, EventArgs e)
        {
            if (this.estadoActual == EstadoActual.Nuevo || this.estadoActual == EstadoActual.Editar)
            {
                ClearControls();
            }
            this.estadoActual = EstadoActual.Normal;
            EnabledControls(true);
            EnabledButtons(true);
            this.detVendiblesBindingSource.CancelEdit();
            this.detallesVentasDataGridView.Focus();
        }
         
        private void insumosDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                if (this.estadoActual == EstadoActual.Normal)
                    LoadDetalle(this.detVendiblesBindingSource.Current as DetalleVendibles);
            }
        }

        private void detalleDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (this.estadoActual != EstadoActual.Normal) return;
            if (e.KeyCode == Keys.Delete)
            {
                if (this.detallesVentasDataGridView.SelectedRows.Count != 0)
                {
                    if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.No)
                    {
                        e.Handled = true;
                    }
                    else
                    {
                        this.estadoActual = EstadoActual.Eliminar;
                        SaveData();
                        this.estadoActual = EstadoActual.Normal;
                        if (this.detVendiblesBindingSource.Current != null)
                        {
                            LoadDetalle(this.detVendiblesBindingSource.Current as DetalleVendibles);
                        }
                    }
                }
            }
        }

        public void InitialLoad()
        {
            try
            {
                if (_ListaDetalle == null)
                {
                    ListaDetalle = new List<DetalleVendibles>();
                }
                detVendiblesBindingSource.DataSource = new List<DetalleVendibles>(_ListaDetalle);
                if(this._cwfVentas != null) this._cwfVentas.total = calcularTotal();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        private void LoadDetalle(DetalleVendibles detalle)
        {
            this.vendibleCmb.Text = detalle.nombre;
            this.vendibleIDLabel.Text = detalle.vendibleID.ToString();
            this.precioTextBox.Text = detalle.precioBruto.ToString();
            this.IGVTextBox.Text = detalle.IGV.ToString();
            this.serviciosTextBox.Text = detalle.servicios.ToString();
            this.netoTextBox.Text = detalle.precioNeto.ToString();
            this.cantidadTextBox.Text = detalle.cantidad.ToString();
            this.tipoLabel.Text = ((int)detalle.tipo).ToString();
            //this.txtNombreInsumo.Text = detalle.Insumos.nombre;
        }

        private bool SaveData()
        {
            DetalleVendibles detalle, nuevoDetalle;
            bool result = false;

            try
            {
                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        detalle = GetDetalle();
                        _ListaDetalle.Add(detalle);
                        if (detalle.tipo == TipoVendible.Insumo) detallesInsumos.Add(detalle.ConvertToDetalleInsumos());
                        else if (detalle.tipo == TipoVendible.Producto) detallesProductos.Add(detalle.ConvertToDetalleProductos());
                        else if (detalle.tipo == TipoVendible.Combo) detallesCombos.Add(detalle.ConvertToDetalleCombos());
                        break;
                    case EstadoActual.Editar:
                        int index = 0;
                        detalle = this.detVendiblesBindingSource.Current as DetalleVendibles;
                        nuevoDetalle = GetDetalle();

                        foreach (DetalleVendibles item in _ListaDetalle)
                        {
                            if (item.vendibleID.Equals(detalle.vendibleID) && item.tipo.Equals(detalle.tipo))
                            {
                                _ListaDetalle[index] = nuevoDetalle;
                                break;
                            }
                            index++;
                        }

                        if (detalle.tipo == TipoVendible.Insumo)
                        {
                            foreach (DetallesVentasInsumos item in detallesInsumos)
                            {
                                if (item.insumoID == detalle.vendibleID)
                                {
                                    detallesInsumos.Remove(item);
                                    break;
                                }
                            }
                        }
                        else if (detalle.tipo == TipoVendible.Producto)
                        {
                            foreach (DetallesVentasProductos item in detallesProductos)
                            {
                                if (item.productoID == detalle.vendibleID)
                                {
                                    detallesProductos.Remove(item);
                                    break;
                                }
                            }
                        }
                        else if (detalle.tipo == TipoVendible.Combo)
                        {
                            foreach (DetallesVentasCombos item in detallesCombos)
                            {
                                if (item.comboID == detalle.vendibleID)
                                {
                                    detallesCombos.Remove(item);
                                    break;
                                }
                            }
                        }

                        if (nuevoDetalle.tipo == TipoVendible.Insumo) detallesInsumos.Add(nuevoDetalle.ConvertToDetalleInsumos());
                        else if (nuevoDetalle.tipo == TipoVendible.Producto) detallesProductos.Add(nuevoDetalle.ConvertToDetalleProductos());
                        else if (nuevoDetalle.tipo == TipoVendible.Combo) detallesCombos.Add(nuevoDetalle.ConvertToDetalleCombos());
                        break;
                    case EstadoActual.Eliminar:
                        detalle = this.detVendiblesBindingSource.Current as DetalleVendibles;
                        _ListaDetalle.Remove(detalle);
                        this.detVendiblesBindingSource.RemoveCurrent();

                        if (detalle.tipo == TipoVendible.Insumo)
                        {
                            foreach (DetallesVentasInsumos item in detallesInsumos)
                            {
                                if (item.insumoID == detalle.vendibleID)
                                {
                                    detallesInsumos.Remove(item);
                                    break;
                                }
                            }
                        }
                        else if (detalle.tipo == TipoVendible.Producto)
                        {
                            foreach (DetallesVentasProductos item in detallesProductos)
                            {
                                if (item.productoID == detalle.vendibleID)
                                {
                                    detallesProductos.Remove(item);
                                    break;
                                }
                            }
                        }
                        else if (detalle.tipo == TipoVendible.Combo)
                        {
                            foreach (DetallesVentasCombos item in detallesCombos)
                            {
                                if (item.comboID == detalle.vendibleID)
                                {
                                    detallesCombos.Remove(item);
                                    break;
                                }
                            }
                        }

                        break;
                }

                this.detVendiblesBindingSource.EndEdit();
                result = true;
                InitialLoad();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
            return result;
        }

        private decimal calcularTotal()
        {
            decimal total = 0;
            foreach (DetalleVendibles item in _ListaDetalle)
            {
                total += item.subTotal;
            }
            return total;
        }

        private DetalleVendibles GetDetalle()
        {
            return new DetalleVendibles
            {
                vendibleID = Convert.ToInt16(vendibleIDLabel.Text),
                nombre = vendibleCmb.Text,
                precioBruto = Convert.ToDecimal(precioTextBox.Text),
                IGV = Convert.ToDecimal(IGVTextBox.Text),
                servicios = Convert.ToDecimal(serviciosTextBox.Text),
                cantidad = Convert.ToByte(cantidadTextBox.Text),
                tipo = (TipoVendible)(Convert.ToInt32(tipoLabel.Text))
            };
        }

        private bool ValidateData()
        {
            bool result = true;

            if (this.vendibleIDLabel.Text=="-1")
            {
                this.errValidator.SetError(this.vendibleCmb, "Seleccionar Producto.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.vendibleCmb, string.Empty);
            }

            if (string.IsNullOrEmpty(precioTextBox.Text))
            {
                this.errValidator.SetError(this.precioTextBox, "Ingresar Precio.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.precioTextBox, string.Empty);
            }

            if (string.IsNullOrEmpty(this.cantidadTextBox.Text))
            {
                this.errValidator.SetError(this.cantidadTextBox, "Ingresar Cantidad.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cantidadTextBox, string.Empty);
            }

            if (result)
            {
                int act = detallesVentasDataGridView.CurrentRow.Index;
                for (int i = 0; i < _ListaDetalle.Count; i++)
                {
                    if (_ListaDetalle[i].vendibleID == Convert.ToInt16(vendibleIDLabel.Text))
                    {
                        if (_ListaDetalle[i].tipo == (TipoVendible)Convert.ToInt16(tipoLabel.Text))
                        {
                            if (i != act)
                            {
                                this.errValidator.SetError(this.vendibleCmb, "Este producto ya a sido asignado.");
                                result = false;
                                break;
                            }
                        }
                    }
                }
            }

            //if (result)
            //{
            //    int ind = detallesVentasDataGridView.CurrentRow.Index;
            //    List<Insumos> consumoInsumos = new List<Insumos>();
            //    DetalleVendibles actual = GetDetalle();
            //    DetalleVendibles detalle;

            //    for (int i = 0; i < _ListaDetalle.Count; i++)
            //    {
            //        if (i == ind) detalle = actual;
            //        else detalle = _ListaDetalle[0];

            //        if (detalle.tipo == TipoVendible.Insumo)
            //        {
            //            agregarConsumo(consumoInsumos, new Insumos()
            //            {
            //                insumoID = detalle.vendibleID,
            //                stock = detalle.cantidad
            //            });
            //        }
            //        else
            //        {
            //            Productos producto = ProductosManager.Instancia.Obtener(detalle.vendibleID);
            //            foreach (Productos_Insumos ingrediente in producto.Productos_Insumos)
            //            {
            //                agregarConsumo(consumoInsumos, new Insumos()
            //                {
            //                    insumoID = ingrediente.insumoID,
            //                    stock = (double)detalle.cantidad * ingrediente.cantidad
            //                });
            //            }
            //        }
            //    }

            //    foreach (Insumos item in consumoInsumos)
            //    {
            //        Insumos insumo = InsumosManager.Instancia.Obtener(item.insumoID);
            //        if (insumo.stock < item.stock)
            //        {
            //            this.errValidator.SetError(this.cantidadTextBox, "No hay stock suficiente.");
            //            result = false;
            //            break;
            //        }
            //    }
            //}

            return result;
        }

        private void EnabledControls(bool valor)
        {
            this.groupBox1.Enabled = !valor;
            this.detallesVentasDataGridView.Enabled = valor;
        }

        private void EnabledButtons(bool valor)
        {
            this.TsbNuevo.Enabled = valor;
            this.TsbEditar.Enabled = valor;
            this.TsbEliminar.Enabled = valor;

            if (this.estadoActual == EstadoActual.Nuevo ||
                this.estadoActual == EstadoActual.Editar)
            {
                this.TsbGuardar.Enabled = true;
                this.TsbCancelar.Enabled = true;
                this.detallesVentasDataGridView.Enabled = false;
            }
            else
            {
                this.TsbGuardar.Enabled = false;
                this.TsbCancelar.Enabled = false;
                this.detallesVentasDataGridView.Enabled = true;
            }
        }

        public void ClearControls()
        {
            ventaIDLabel.Text = "-1";
            vendibleCmb.Text = "[Seleccionar un producto]";
            precioTextBox.Text = string.Empty;
            IGVTextBox.Text = string.Empty;
            serviciosTextBox.Text = string.Empty;
            netoTextBox.Text = string.Empty;
            cantidadTextBox.Text = string.Empty;
            vendibleIDLabel.Text = "-1";
            errValidator.Clear();
        }

        private void insumoCmb_DropDown(object sender, EventArgs e)
        {
            detVentaBusqueda.limpiar();
            vendibleCmb.Text = "[Seleccionar un producto]";
        }

        private void insumoCmb_DropDownClosed(object sender, EventArgs e)
        {

        }

        public void insumosBusqueda_CwfInsumoBusqueda_SeleccionEntidad(object objeto)
        {
            Vendibles vendible = (Vendibles)objeto;
            vendibleCmb.Text = vendible.nombre;
            tipoLabel.Text = ((int)vendible.tipo).ToString();
            vendibleIDLabel.Text = vendible.vendibleID.ToString();
            precioTextBox.Text = vendible.precioBruto.ToString();
            IGVTextBox.Text = vendible.IGV.ToString();
            serviciosTextBox.Text = vendible.servicios.ToString();
            netoTextBox.Text = vendible.precioNeto.ToString();
            cantidadTextBox.Focus();
            vendibleCmb.HideDropDown();
        }

        private void insumoCmb_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Down)
            {
                vendibleCmb.ShowDropDown();
            }
            else
                e.SuppressKeyPress = true;
        }

        public void MenuSoloConImagenes(bool estado)
        {
            this.TsMenu.SuspendLayout();
            if (estado)
            {
                TsbNuevo.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbEditar.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbCancelar.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbGuardar.DisplayStyle = ToolStripItemDisplayStyle.Image;
                TsbEliminar.DisplayStyle = ToolStripItemDisplayStyle.Image;
            }
            else
            {
                TsbNuevo.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbEditar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbCancelar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbGuardar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
                TsbEliminar.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
            }
            this.TsMenu.ResumeLayout();
        }
    }
}
